home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TeX 1995 July
/
TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO
/
macros
/
latex209
/
contrib
/
textyl
/
psrc
/
tylext.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-11-07
|
4KB
|
139 lines
/* External procedures for dvitype */
/* Written by: H. Trickey, 2/19/83 (adapted from TeX's ext.c) */
#include "texpaths.h" /* defines default TEXFONTS path */
#include "h00vars.h" /* defines Pascal I/O structure */
char *fontpath;
char *getenv();
/*
* setpaths is called to set up the pointer fontpath
* as follows: if the user's environment has a value for TEXFONTS
* then use it; otherwise, use defaultfontpath.
*/
setpaths()
{
register char *envpath;
if ((envpath = getenv("TEXFONTS")) != NULL)
fontpath = envpath;
else
fontpath = defaultfontpath;
}
#define namelength 100 /* should agree with defn in textyl program*/
extern char thefilename[],realnameoffile[]; /* these have size namelength */
/*
* testaccess(amode,filepath)
*
* Test whether or not the file whose name is in the global thefilename
* can be opened for reading (if mode=READACCESS)
* or writing (if mode=WRITEACCESS).
*
* The filepath argument is one of the ...FILEPATH constants defined below.
* If the filename given in thefilename does not begin with '/', we try
* prepending all the ':'-separated areanames in the appropriate path to the
* filename until access can be made, if it ever can.
*
* The realnameoffile global array will contain the name that yielded an
* access success.
*/
#define READACCESS 4
#define WRITEACCESS 2
#define NOFILEPATH 0
#define FONTFILEPATH 3
bool
testaccess(amode,filepath)
int amode,filepath;
{
register bool ok;
register char *p;
char *curpathplace;
int f;
switch (filepath) {
case NOFILEPATH:
curpathplace = NULL;
break;
case FONTFILEPATH:
curpathplace = fontpath;
break;
}
if (thefilename[0] == '/') /* file name has absolute path */
curpathplace = NULL;
do {
packrealnameoffile (&curpathplace);
if (amode == READACCESS)/* use system call "access" to see if we
could read it */
if (access (realnameoffile, READACCESS) == 0)
ok = TRUE;
else
ok = FALSE;
else {
/* WRITEACCESS: use creat to see if we could create it, but close
the file again if we''re OK, to let pc open it for real */
f = creat (realnameoffile, 0666);
if (f >= 0)
ok = TRUE;
else
ok = FALSE;
if (ok)
close (f);
}
} while (!ok && curpathplace != NULL);
if (ok) { /* pad realnameoffile with blanks, as
Pascal wants */
for (p = realnameoffile; *p != '\0'; p++)
/* nothing: find end of string */
;
while (p < &(realnameoffile[namelength]))
*p++ = ' ';
}
return (ok);
}
/*
* packrealnameoffile(cpp) makes realnameoffile contain the directory at *cpp,
* followed by '/', followed by the characters in thefilename up until the
* first blank there, and finally a '\0'. The cpp pointer is left pointing
* at the next directory in the path.
* But: if *cpp == NULL, then we are supposed to use thefilename as is.
*/
packrealnameoffile(cpp)
char **cpp;
{
register char *p,
*realname;
realname = realnameoffile;
if ((p = *cpp) != NULL) {
while ((*p != ':') && (*p != '\0')) {
*realname++ = *p++;
if (realname == &(realnameoffile[namelength - 1]))
break;
}
if (*p == '\0')
*cpp = NULL; /* at end of path now */
else
*cpp = p + 1; /* else get past ':' */
*realname++ = '/'; /* separate the area from the name to
follow */
}
/* now append thefilename to realname... */
p = thefilename;
while (*p != ' ') {
if (realname >= &(realnameoffile[namelength - 1])) {
fprintf (stderr, "! Full file name is too long\n");
break;
}
*realname++ = *p++;
}
*realname = '\0';
}